安全漏洞产生原因有哪些
软件或产品漏洞是由于软件在需求、设计、开发、部署或维护阶段,由于开发或使用者有意或无意产生的缺陷所造成的。信息系统漏洞产生的原因主要是由于构成系统的元素,例如,硬件、软件、协议等在具体实现或安全策略上存在的缺陷。事实上,由于人类思维能力、计算机计算能力的局限性等根本因素,导致漏洞的产生是不可避免的。
技术原因
随着信息化技术和应用的不断发展,人们对软件信息技术的依赖越来越强,对信息产品和系统的功能和性能的要求也越来越高,在此驱动下,软件系统的规模不断膨胀。同时,由于软件编程技术、可视化技术、系统集成技术的不断发展,更进一步的促使软件系统内部结构和逻辑日益复杂。软件系统规模的迅速膨胀及内部结构的复杂化,导致软件系统复杂性的提高,目前学术界普遍认为,软件系统代码的复杂性是导致软件系统质量难于控制、安全性降低和漏洞产生的重要原因。
开源软件的出现和快速发展给软件开发带来了便利,软件开发厂商为了节约开发成本和缩短开发时间,常常鼓励程序开发者使用开源软件中的某些功能或系统模块(以下简称公用模块)。公用模块使用了很多业界主流或较新的技术,对软件产业的发展带来了极大的便利,但是公用模块也存在一些安全问题。在开源社区中,对源代码中安全补丁的修复及管理往往不能准确和及时地进行,甚至出现没有人修复的情况。此外,即使公用模块的开发者及时发布了安全补丁,使用公用模块的开发商如果没有及时关注补丁信息,也可能导致自己软件中的漏洞不能被及时修复。某些恶意的攻击者,可以通过分析公用模块的源代码发现或利用公用模块中的漏洞,甚至直接开发带有恶意代码甚至后门的公用模块放置在互联网上。
经济原因
软件系统的安全性不是显性价值,厂商要实现安全性就要额外付出巨大的代价。此时,软件系统的安全质量产生了信息非对称现象,即产品的卖方对产品质量比买方有更多的信息。在这种情况下,经济学上著名的“柠檬市场”效应会出现,即在信息不对称的情况下,往往好的商品被淘汰,而劣等品会逐渐占领市场并取代好的商品,导致市场中都是劣等品。在这种市场之下,厂商更加重视软件系统的功能、性能、易用性,而不愿意在安全质量上做大的投入。在某些情况下,甚至为了提高软件效率而牺牲了安全性,使得软件系统安全问题越来越严重。这种现象可以进一步归结为经济学上的外在性(externality),像环境污染一样,软件系统漏洞的代价要全社会来承受,而厂商拿走了所有的收益。
应用环境原因
以Internet为代表的网络逐渐融入人类社会生活的方方面面,伴随着Internet技术与信息技术的不断融合与发展,导致软件系统的运行环境发生了改变,从传统的封闭、静态和可控状态变为开放、动态和难控状态。因此,复杂的网络环境导致软件系统的攻防信息不对称性进一步增强,攻易守难的矛盾进一步凸显。与非网络或同构网络环境下的漏洞相比,复杂异构网络环境会产生更多的漏洞类型和数量,而且漏洞的危害和影响也更加严重。
安全缺陷
安全缺陷是指软件、硬件或协议在开发维护和运行使用阶段产生的安全错误实例。安全缺陷是信息系统或产品自身“与生俱来”的特征,是其固有的成分。无论是复杂的软件系统还是简单的应用程序,都可能存在着安全缺陷。这些安全缺陷,有的容易表现出来,有的却难以发现;有的对软件产品的使用有轻微影响,有的可在一定的条件下,形成漏洞并会造成财产乃至生命等巨大损失。
软件系统在不同的开发阶段会产生不同的安全缺陷。安全缺陷存在于软件系统生命周期的各个阶段。在问题定义阶段,系统分析员对问题性质、问题规模和方案的考虑不周全会引入安全缺陷,这种安全缺陷在开发前不易察觉,只有到了测试阶段甚至投入使用后才能显现出来。在定义需求阶段,需求定义的不完善是导致安全缺陷的最主要原因。在系统设计阶段,错误的设计方案是安全缺陷的直接原因。在编码实现阶段,安全缺陷可能是错误地理解了算法导致了代码错误,也可能是无意的代码编写上的一个错误等。在测试阶段,测试人员可能对安全缺陷出现条件判断错误,修改了一个错误,却引入了更多安全缺陷。在维护阶段,修改了有缺陷的代码,却又导致了先前正确的模块出现错误等。在使用阶段,用户的使用错误或配置错误也可以触发系统中的安全缺陷,影响系统安全。
根据漏洞和安全缺陷的定义可知,一个漏洞是由一个或多个安全缺陷造成的。因此,安全缺陷与漏洞的对应关系存在两种情况,一种是一个缺陷对应于一个漏洞,即缺陷与漏洞一一对应。另一种情况是,多个缺陷对应于一个漏洞,即缺陷与漏洞之间是多对一的关系。
最后是安全缺陷的利用技术和手段。攻击者对安全缺陷的利用过程与其个人的能力水平密切相关,同一个缺陷可能有不同的利用方法,产生不同的破坏效果,而且一个成功的利用过程往往需要组合多种缺陷、方法和手段。